home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / gg11.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  25KB  |  729 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. /* file coder2 (for deterministic prefixes) */
  22. #include "gg1.h"
  23. #include "gg2.h"
  24.  
  25. extern int mems_lifted, highest_tempory, nraffixes;
  26.  
  27.  
  28. /* 
  29.  * affix offset count 
  30.  */
  31. int oCount = 0;
  32.  
  33. det_rule_head()
  34. {
  35.     fprintf(output, "\n\n/*  %s   */\n",REPR(ulhs));
  36.     if (MARKED(ulhs,external)) 
  37.        fprintf(output, "int d%s(", REPR(ulhs));
  38.     else fprintf(output, "static int D_%d(", ulhs);
  39.     det_get_affixes(AFFIXDEF(SON(ulhs)));
  40.     if (fprintf(output, " {\n register AFFIX raf = af;\n") == EOF) {
  41.        fprintf(stderr,"glammar: Write failed (try again later)\n");
  42.        exit(12);
  43.     }
  44.       fprintf(output, "  char *rc = c,  *rip = ip;\n");
  45.     if (lookahead_in_alt(SON(ulhs)))
  46.       fprintf(output, "  char *lkh;\n");
  47.     if (BROTHER(SON(ulhs)) != nil)
  48.       fprintf(output, "  int cut_set = 0;\n");
  49.     if (trace_flag ) 
  50.      fprintf(output, " char *ntname = \"%s\";int ltr=level+1;\n",REPR(ulhs));
  51.     else if (errormsg_flag)  { 
  52.       int mem = SON(SON(ulhs));
  53.       if (mem != nil && DEF(mem) == equal) 
  54.       fprintf(output, 
  55.          "  char *ntname = \"%s\"; int lsave = level+10;\n", REPR(ulhs));
  56.       else fprintf(output, 
  57.          "  char *ntname = \"%s\"; int lsave = level++;\n", REPR(ulhs));
  58.      }
  59.           
  60.     if (stat_flag)  {  
  61.       fprintf(output, "  int s1 = stat_count++;\n");
  62.     }
  63.     save_lattice_afx();
  64.     
  65. }
  66.  
  67. det_rule_tail() {
  68.     int last_alt;
  69.  
  70.     for (last_alt = SON(ulhs); BROTHER(last_alt) != nil; 
  71.                                       last_alt =  BROTHER(last_alt)) ;
  72.     if (SON(last_alt) == nil) {
  73.        fprintf(output,"  \n}\n");
  74.        return;
  75.     }
  76.  
  77.     if (trace_flag) {
  78.        if (errormsg_flag) 
  79.            fprintf(output, "  set_errmsg(ntname);\n");
  80.        fprintf(output, "  level = ltr;endtrace(parsecount,ntname);");
  81.     } 
  82.     else if (errormsg_flag) {
  83.        fprintf(output, "  set_errmsg(ntname);\n");
  84.        fprintf(output, " level = lsave;\n");  
  85.     } 
  86. /*   
  87.  */
  88.   if (stat_flag) 
  89.       fprintf(output, "  stat_tab[%d] += stat_count - s1;\n",COUNT(ulhs));
  90.  
  91.  
  92.   fprintf(output,"  return false;\n}\n");
  93. }
  94.      
  95. det_get_affixes(afx)
  96.   int             afx;
  97.   int affix = afx, count = 0;
  98.    
  99.   if (afx == nil)  {
  100.     fprintf(output, ")\n");
  101.     return;
  102.   } 
  103.  
  104.   for (; affix != nil; affix = BROTHER(affix)) 
  105.     if (BROTHER (affix) != nil)
  106.        fprintf(output, "A_%d,",count++); 
  107.     else   fprintf(output, "A_%d)\n",count++); 
  108.  
  109.    count = 0; 
  110.    for (affix = afx; affix != nil; affix = BROTHER(affix)) 
  111.     fprintf(output, "  register AFFIX A_%d;\n", count++); 
  112. }
  113.  
  114.  
  115. det_rule_alts(alt)
  116. {
  117.   int             affix = (AFFIXDEF(alt)),
  118.                   rule = ulhs;
  119.  
  120.   if (trace_flag)
  121.     trace_code(affix);
  122.   for (; alt != nil; alt = BROTHER(alt)) {
  123.     
  124.     fprintf(output, "  {\n");
  125.     det_alt_code(alt);
  126.     fprintf(output, "  }\n");
  127.     if (BROTHER (alt) != nil) {
  128.          fprintf(output," ip = rip; c = rc;\n");
  129.          restore_lattice_afx();
  130.        if (trace_flag) {
  131.          fprintf(output, "  if (cut_set) {\n");
  132.          if (stat_flag)
  133.             fprintf(output, "  stat_tab[%d] += stat_count-s1;\n",COUNT(ulhs));
  134.        fprintf(output, "  level = ltr;endtrace(parsecount,ntname);");
  135.        if (errormsg_flag) 
  136.            fprintf(output, "  set_errmsg(ntname);\n");
  137.        fprintf(output," return false;\n}\n");
  138.        } else  {
  139.           if (errormsg_flag) 
  140.               fprintf(output, 
  141.             " if (cut_set) { level=lsave;set_errmsg(ntname);return false;}\n");
  142.           if (stat_flag)
  143.               fprintf(output,
  144.      " if (cut_set) { stat_tab[%d] += stat_count-s1;return false;}\n",COUNT(ulhs));
  145.          else 
  146.              fprintf(output,  " if (cut_set) return false;\n");
  147.        }
  148.     }
  149.   }
  150. }
  151.  
  152.  
  153. det_define_all_derived_affixes(alt)
  154.   int             alt;
  155. {
  156.   int             affix, mem;
  157.  
  158.   for (mem = SON(alt); mem != nil; mem = BROTHER(mem))
  159.     for (affix = AFFIXTREE(mem); affix != nil; affix = BROTHER(affix)) {
  160.       int             term = SON(affix);
  161.  
  162.       if (NODENAME(affix) == derived)
  163.         if ((APPLY_BOUND_AFFIX(term)) &&   (!IS_LEFTDEF(term)))
  164.           fprintf(output, "  AFFIX  _%s = (raf+%d);\n", REPR(term),++oCount);
  165.       if ( (LATTICE(affix)) && (!IS_LEFTDEF(term)))
  166.           fprintf(output, "  AFFIX  _%s = (raf+%d);\n", REPR(term),++oCount);
  167.  
  168.     }
  169. }
  170.  
  171. det_initialize_all_derived_affixes(alt)
  172.   int             alt;
  173. {
  174.   int             affix, mem;
  175.  
  176.   for (mem = SON(alt); mem != nil; mem = BROTHER(mem))
  177.     for (affix = AFFIXTREE(mem); affix != nil; affix = BROTHER(affix)) {
  178.       int             term = SON(affix);
  179.  
  180.       if (NODENAME(affix) == derived) {
  181.         if ((IS_LEFTDEF(term)) &&  (NODENAME(term) == affixnt)) {
  182.           if (ISNT_DONTCARE(term))   
  183.              fprintf(output, "   A_%d -> t = undefined;\n", LEFTDEF(term));
  184.         } else
  185.           fprintf(output, "   _%s -> t = undefined;\n", REPR(term));
  186.       }
  187.    }
  188. }
  189.  
  190.  
  191. det_nice_lift_tree(lt, rt)
  192.   int             lt, rt;
  193. {
  194.   int             term;
  195.  
  196.   if (lt == rt)
  197.     return;
  198.   term = BROTHER(lt);
  199.   if (term == rt) {
  200.     if (NODENAME(lt) == affixtm) {
  201.       aCount += 1;
  202.       fprintf(output, "(raf+%d) -> t = \"%s\",(raf+%d) -> l = nil,(raf+%d) -> r = nil,",
  203.         aCount, REPR(lt), aCount, aCount);
  204.     }
  205.     return;
  206.   } else if ((BROTHER(term) == rt) &&  (NODENAME(term) != affixtm)) {
  207.     aCount += 1;
  208.     if (NODENAME(lt) == affixtm) {
  209.       if (IS_LEFTDEF(term))
  210.         fprintf(output, "(raf+%d) -> t = \"%s\",(raf+%d) -> l = nil,(raf+%d) -> r = A_%d,",
  211.           aCount, REPR(lt), aCount, aCount, LEFTDEF(term));
  212.       else if (META(term))
  213.         fprintf(output, "(raf+%d) -> t = \"%s\",(raf+%d) -> l = nil,(raf+%d) -> r = &_%s,",
  214.           aCount, REPR(lt), aCount, aCount, REPR(term));
  215.       else
  216.         fprintf(output, "(raf+%d) -> t = \"%s\",(raf+%d) -> l = nil,(raf+%d) -> r = _%s,",
  217.           aCount, REPR(lt), aCount, aCount, REPR(term));
  218.     } else if (IS_LEFTDEF(lt)) {
  219.       if (IS_LEFTDEF(term))
  220.         fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = A_%d,(raf+%d) -> r = A_%d,",
  221.           aCount, aCount, LEFTDEF(lt), aCount, LEFTDEF(term));
  222.       else if (META(term))
  223.         fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = A_%d,(raf+%d) -> r = &_%s,",
  224.           aCount, aCount, LEFTDEF(lt), aCount, REPR(term));
  225.       else
  226.         fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = A_%d,(raf+%d) -> r = _%s,",
  227.           aCount, aCount, LEFTDEF(lt), aCount, REPR(term));
  228.     } else if (META(lt)) {
  229.       if (IS_LEFTDEF(term))
  230.         fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = &_%s,(raf+%d) -> r = A_%d,",
  231.           aCount, aCount, REPR(lt), aCount, LEFTDEF(term));
  232.       else if (META(term))
  233.         fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = &_%s,(raf+%d) -> r = &_%s,",
  234.           aCount, aCount, REPR(lt), aCount, REPR(term));
  235.       else
  236.         fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = &_%s,(raf+%d) -> r = _%s,",
  237.           aCount, aCount, REPR(lt), aCount, REPR(term));
  238.     } else if (IS_LEFTDEF(term))
  239.       fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = _%s,(raf+%d) -> r = A_%d,",
  240.         aCount, aCount, REPR(lt), aCount, LEFTDEF(term));
  241.     else if (META(term))
  242.       fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = _%s,(raf+%d) -> r = &_%s,",
  243.         aCount, aCount, REPR(lt), aCount, REPR(term));
  244.     else
  245.       fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = _%s,(raf+%d) -> r = _%s,",
  246.         aCount, aCount, REPR(lt), aCount, REPR(term));
  247.     return;
  248.   }
  249.   if (NODENAME(lt) != affixtm) {
  250.     aCount += 1;
  251.     if (IS_LEFTDEF(lt))
  252.       fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = A_%d,(raf+%d) -> r = (raf+%d),",
  253.         aCount, aCount, LEFTDEF(lt), aCount, aCount + 1);
  254.     else if (META(lt))
  255.       fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = /* */ &_%s,(raf+%d) -> r = (raf+%d),",
  256.         aCount, aCount, REPR(lt), aCount, aCount + 1);
  257.     else
  258.       fprintf(output, "(raf+%d) -> t = empty,(raf+%d) -> l = _%s,(raf+%d) -> r = (raf+%d),",
  259.         aCount, aCount, REPR(lt), aCount, aCount + 1);
  260.     det_nice_lift_tree(BROTHER(lt), rt);
  261.   } else {
  262.     aCount += 1;
  263.     fprintf(output, "(raf+%d) -> t = \"%s\",(raf+%d) -> l = nil,(raf+%d) -> r = (raf+%d),",
  264.       aCount, REPR(lt), aCount, aCount, aCount + 1);
  265.     det_nice_lift_tree(BROTHER(lt), rt);
  266.   }
  267. }
  268.  
  269.  
  270. det_code_lifted_affixes(affix)
  271.   int             affix;
  272. {
  273.   fprintf(output, "(");
  274.   for (; affix != nil; affix = BROTHER(affix)) {
  275.     int             term = SON(affix);
  276.  
  277.     if (NODENAME(affix) == inherited) {
  278.       if (BROTHER(term) != nil) {
  279.         int             this_a_count = aCount + 1;
  280.  
  281.         fprintf(output, "(");
  282.         det_nice_lift_tree(term, nil);
  283.         fprintf(output, "  (raf+%d))", this_a_count);
  284.       } else if (NODENAME(term) == affixtm) {
  285.         aCount += 1;
  286.         fprintf(output, 
  287.          "  ((raf+%d) -> t = \"%s\", (raf+%d) -> l = nil, (raf+%d) -> r = nil,(raf+%d))",
  288.           aCount, REPR(term), aCount, aCount, aCount);
  289.       } else if (IS_LEFTDEF(term))
  290.         fprintf(output, "  A_%d", LEFTDEF(term));
  291.        else if (META(term))
  292.         fprintf(output, "  & _%s", REPR(term));
  293.       else
  294.         fprintf(output, "  _%s", REPR(term));
  295.     } else {
  296.       if (IS_LEFTDEF(term))
  297.         fprintf(output, "  A_%d", LEFTDEF(term));
  298.        else if (META(term))
  299.         fprintf(output, "  & _%s", REPR(term));
  300.       else
  301.         fprintf(output, "  _%s", REPR(term));
  302.     }
  303.     if (BROTHER(affix) != nil)
  304.       fprintf(output, ",");
  305.   }
  306.   fprintf(output, ")");
  307. }
  308.  
  309.  
  310. det_result_code(alt)
  311.   int             alt;
  312. {
  313.   int             affix,
  314.                   count = 0;
  315.  
  316.   for (affix = AFFIXDEF(alt); affix != nil; affix = BROTHER(affix)) {
  317.     if (NODENAME(affix) == derived) {
  318.       int             term = SON(affix);
  319.  
  320.       if (BROTHER(term) == nil) {
  321.         if (NODENAME(term) == affixtm)
  322.           fprintf(output,
  323.             "  A_%d -> t = \"%s\"; A_%d -> l = nil; A_%d -> r = nil;\n"
  324.             ,count, REPR(term), count, count);
  325.         else if (IS_LEFTDEF(term))
  326.           fprintf(output, "MAKE(A_%d,A_%d);\n ", count, LEFTDEF(term));
  327.         else if (FREE_AFFIX(term)) {
  328.           fprintf(output, "  A_%d ->t  = _%s.t;", count, REPR(term));
  329.           fprintf(output, "A_%d -> r = nil;", count);
  330.           fprintf(output, "A_%d -> l = nil;\n", count);
  331.         }
  332.       } else {
  333.         int             this_a_count = aCount + 1,
  334.                         bterm = BROTHER(term);
  335.  
  336.         if (BROTHER(bterm) == nil) {
  337.           if ((NODENAME(term) == affixtm) &&  (NODENAME(bterm) == affixtm)) {
  338.             aCount += 1;
  339.             fprintf(output, "  (raf+%d) -> t = \"%s\";", this_a_count, REPR(bterm));
  340.             fprintf(output, "(raf+%d) -> l = nil;", this_a_count);
  341.             fprintf(output, "(raf+%d) -> r = nil;\n", this_a_count);
  342.             fprintf(output, "  A_%d -> t = \"%s\";", count, REPR(term));
  343.             fprintf(output, "A_%d -> r = (raf+%d);", count, this_a_count);
  344.             fprintf(output, "A_%d -> l = nil;", count);
  345.           } else if ((NODENAME(term) != affixtm) && 
  346.             (NODENAME(bterm) == affixtm)) {
  347.             aCount += 1;
  348.             fprintf(output, "  (raf+%d) -> t = \"%s\";", this_a_count, REPR(bterm));
  349.             fprintf(output, "(raf+%d) -> l = nil;", this_a_count);
  350.             fprintf(output, "(raf+%d) -> r = nil;\n", this_a_count);
  351.             if (IS_LEFTDEF(term))
  352.               fprintf(output, "  A_%d -> l = A_%d;", count, LEFTDEF(term));
  353.             else if (META(term))
  354.               fprintf(output, "  A_%d -> l = &_%s;", count, REPR(term));
  355.             else
  356.               fprintf(output, "  A_%d -> l = _%s;", count, REPR(term));
  357.             fprintf(output, "A_%d -> r = (raf+%d);", count, this_a_count);
  358.             fprintf(output, "A_%d -> t = empty;\n", count);
  359.           } else if ((NODENAME(term) == affixtm)  &&
  360.             (NODENAME(bterm) != affixtm)) {
  361.             fprintf(output, "  A_%d -> t = \"%s\";", count, REPR(term));
  362.             if (IS_LEFTDEF(bterm))
  363.               fprintf(output, "A_%d -> r = A_%d;", count, LEFTDEF(bterm));
  364.             else
  365.               fprintf(output, "A_%d -> r = _%s;", count, REPR(bterm));
  366.             fprintf(output, "A_%d -> l = nil;\n", count);
  367.           } else {
  368.             fprintf(output, "  A_%d -> t = empty;", count);
  369.             if (IS_LEFTDEF(term))
  370.               fprintf(output, "A_%d -> l = A_%d;", count, LEFTDEF(term));
  371.             else if (META(term))
  372.               fprintf(output, "A_%d -> l = &_%s;", count, REPR(term));
  373.             else
  374.               fprintf(output, "A_%d -> l = _%s;", count, REPR(term));
  375.             if (IS_LEFTDEF(bterm))
  376.               fprintf(output, "A_%d -> r = A_%d;\n", count, LEFTDEF(bterm));
  377.             else if (META(bterm))
  378.               fprintf(output, "A_%d -> r = /* */ &_%s;\n", count, REPR(bterm));
  379.             else
  380.               fprintf(output, "A_%d -> r = _%s;\n", count, REPR(bterm));
  381.           }
  382.         } else if (NODENAME(term) != affixtm) {
  383.          det_nice_tree(bterm, nil);
  384.           fprintf(output, "  A_%d -> t = empty;", count);
  385.           fprintf(output, "A_%d -> r = (raf+%d);", count, this_a_count);
  386.           if (IS_LEFTDEF(term))
  387.             fprintf(output, "A_%d -> l = A_%d;\n", count, LEFTDEF(term));
  388.           else if (META(term))
  389.             fprintf(output, "A_%d -> l = & _%s;\n", count, REPR(term));
  390.           else
  391.             fprintf(output, "A_%d -> l = _%s;\n", count, REPR(term));
  392.         } else {
  393.           det_nice_tree(bterm, nil);
  394.           fprintf(output, "  A_%d -> t = \"%s\";", count, REPR(term));
  395.           fprintf(output, "A_%d -> r = (raf+%d);", count, this_a_count);
  396.           fprintf(output, "A_%d -> l = nil;\n", count);
  397.         }
  398.       }
  399.     } else if (LATTICE(affix)) 
  400.          if (NODENAME(SON(affix)) == affixtm) {
  401.           int term = SON(affix);
  402.           fprintf(output," A_%d ->t = (char *) 0X%x;\n",count,
  403.               NODENAME(LATTICE_DEF(term)));
  404.          }
  405.     count += 1;
  406.   }
  407. }
  408.  
  409.  
  410. det_alt_code(alt)
  411.   int             alt;
  412. {
  413.   int             mem;
  414.  
  415.   oCount = 0;
  416.   det_alt_intermediate_defs(alt);
  417.   aCount = 0;
  418.   det_define_all_derived_affixes(alt);
  419.   det_initialize_all_derived_affixes(alt);
  420.   if (oCount >0) {
  421.     fprintf (output , " af = (raf+%d);\n",oCount); 
  422.     fprintf (output , " if (af > afx_top ) afx_overflow();\n"); 
  423.   }
  424.   det_lift_code(alt);
  425.   fprintf (output,"   {\n"); 
  426.   det_result_code(alt);
  427.   fprintf (output,"   return true;\n    }\n"); 
  428. }
  429.  
  430.  
  431. det_lift_code(alt)
  432.   int             alt;
  433. {
  434.   int             mem = SON(alt);
  435.  
  436.   mems_lifted = false;
  437.   if ((mem == nil) || (!lift_element(mem)))
  438.     return;
  439.   for (mem = SON(alt); (mem != nil) &&  (lift_element(mem)); mem = BROTHER(mem)) {
  440.     if (LKH(mem))
  441.             fprintf(output, "   if (lkh = ip)\n");
  442.     if (TERMINAL(mem))
  443.       det_code_lifted_terminal(mem, AFFIXTREE(mem));
  444.     else {
  445.       if (DEF(mem) == cut) {
  446.         if (BROTHER(mem) != nil) 
  447.             fprintf(output, "   if (cut_set = 1)\n");
  448.         }
  449.      else if (!MARKED(DEF(mem),external)) {
  450.         fprintf(output, "   if ( D_%d", DEF(mem));
  451.         det_code_lifted_affixes(AFFIXTREE(mem));
  452.         fprintf(output, ")\n");
  453.       }
  454.       else {
  455.         fprintf(output, "   if ( d%s",  REPR(mem));
  456.         det_code_lifted_affixes(AFFIXTREE(mem));
  457.         fprintf(output, ")\n");
  458.       }
  459.     }
  460.     if (LKH(mem))
  461.             fprintf(output, "   if (ip = lkh)\n");
  462.   }
  463. }
  464.  
  465.  
  466. det_lkh_epiloque()
  467. {
  468.   fprintf(output, "  if (lkh = 1) \n");
  469.   fprintf(output, "  (rq+%d)->q = kh_epiloque;\n", ++qCount);
  470. }
  471.  
  472.  
  473. det_code_lifted_terminal(termi, afx)
  474.   int             termi,
  475.                   afx;
  476. {
  477.   int             trm;
  478.  
  479.   if (STRING(termi)) {
  480.     fprintf(output, "  if (dterminal_(\"%s\"))\n", REPR(termi));
  481.     return;
  482.   }
  483.   trm = SON(afx);
  484.   if (IS_LEFTDEF(trm)) {
  485.     if (COMPLEMENT(termi)) {
  486.       if (EXCLAMATIONSTARCHOICE(termi))
  487.         fprintf(output, "  if ( dx_star_ex_choice(\"%s\",A_%d))\n",
  488.           REPR(termi), LEFTDEF(trm));
  489.       else if (EXCLAMATIONPLUSCHOICE(termi))
  490.         fprintf(output, "  if (dx_plus_ex_choice(\"%s\",A_%d))\n",
  491.           REPR(termi), LEFTDEF(trm));
  492.       else
  493.         fprintf(output, "  if (dex_choice(\"%s\",A_%d))\n",
  494.           REPR(termi), LEFTDEF(trm));
  495.     } else if (EXCLAMATIONSTARCHOICE(termi))
  496.       fprintf(output, "  if (dx_star_choice(\"%s\",A_%d))\n",
  497.         REPR(termi), LEFTDEF(trm));
  498.     else if (EXCLAMATIONPLUSCHOICE(termi))
  499.       fprintf(output, "  if (dx_plus_choice(\"%s\",A_%d))\n",
  500.         REPR(termi), LEFTDEF(trm));
  501.     else
  502.       fprintf(output, "  if (dchoice_(\"%s\",A_%d))\n",
  503.         REPR(termi), LEFTDEF(trm));
  504.   } else {
  505.     if (COMPLEMENT(termi)) {
  506.       if (EXCLAMATIONSTARCHOICE(termi))
  507.         fprintf(output, "  if (dx_star_ex_choice(\"%s\",_%s))\n",
  508.           REPR(termi), REPR(trm));
  509.       else if (EXCLAMATIONPLUSCHOICE(termi))
  510.         fprintf(output, "  if (dx_plus_ex_choice(\"%s\",_%s))\n",
  511.           REPR(termi), REPR(trm));
  512.       else
  513.         fprintf(output, "  if (dex_choice(\"%s\",_%s))\n",
  514.           REPR(termi), REPR(trm));
  515.     } else if (EXCLAMATIONSTARCHOICE(termi))
  516.       fprintf(output, "  if (dx_star_choice(\"%s\",_%s))\n",
  517.         REPR(termi), REPR(trm));
  518.     else if (EXCLAMATIONPLUSCHOICE(termi))
  519.       fprintf(output, "  if (dx_plus_choice(\"%s\",_%s))\n",
  520.         REPR(termi), REPR(trm));
  521.     else
  522.       fprintf(output, "  if (dchoice_(\"%s\",_%s))\n",
  523.         REPR(termi), REPR(trm));
  524.   }
  525. }
  526.  
  527.  
  528. det_alt_intermediate_defs(alt)
  529.   int             alt;
  530.  
  531. {
  532.   int             mem = SON(alt),
  533.                   count;
  534.  
  535.   aCount = 0;
  536.   highest_tempory = 0;
  537.   result_intermediate_defs(alt);
  538.   if (mem == nil);
  539.   else if (BROTHER(mem) == nil)
  540.     affix_intermediate_defs(mem);
  541.   else {
  542.     mems_intermediate_defs(BROTHER(mem));
  543.     affix_intermediate_defs(mem);
  544.   }
  545.   if (highest_tempory > aCount)
  546.     aCount = highest_tempory;
  547.    oCount = aCount; 
  548. }
  549.  
  550. det_nice_tree(lt, rt)
  551.   int             lt, rt;
  552. {
  553.   int             term;
  554.  
  555.   if (lt == rt)
  556.     return;
  557.   term = BROTHER(lt);
  558.   if (term == rt) {
  559.     if (NODENAME(lt) == affixtm) {
  560.       aCount += 1;
  561.       fprintf(output, "  (raf+%d) ->t = \"%s\"; (raf+%d) ->l = nil; (raf+%d) ->r = nil;\n",
  562.         aCount, REPR(lt), aCount, aCount);
  563.     }
  564.     return;
  565.   } else if ((BROTHER(term) == rt) && (NODENAME(term) != affixtm)) {
  566.     aCount += 1;
  567.     if (NODENAME(lt) == affixtm) {
  568.       if (IS_LEFTDEF(term))
  569.         fprintf(output, "  (raf+%d) ->t = \"%s\"; (raf+%d) ->l = nil; (raf+%d) ->r = A_%d;\n",
  570.           aCount, REPR(lt), aCount, aCount, LEFTDEF(term));
  571.       else if (META(term))
  572.         fprintf(output, "  (raf+%d) ->t = \"%s\"; (raf+%d) ->l = nil; (raf+%d) ->r = &_%s;\n",
  573.           aCount, REPR(lt), aCount, aCount, REPR(term));
  574.       else
  575.         fprintf(output, "  (raf+%d) ->t = \"%s\"; (raf+%d) ->l = nil; (raf+%d) ->r = _%s;\n",
  576.           aCount, REPR(lt), aCount, aCount, REPR(term));
  577.     } else if (IS_LEFTDEF(lt)) {
  578.       if (IS_LEFTDEF(term))
  579.         fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = A_%d; (raf+%d) ->r =  A_%d;\n",
  580.           aCount, aCount, LEFTDEF(lt), aCount, LEFTDEF(term));
  581.       else if (META(term))
  582.         fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = A_%d; (raf+%d) ->r = &_%s;\n",
  583.           aCount, aCount, LEFTDEF(lt), aCount, REPR(term));
  584.       else
  585.         fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = A_%d; (raf+%d) ->r = _%s;\n",
  586.           aCount, aCount, LEFTDEF(lt), aCount, REPR(term));
  587.     } else if (IS_LEFTDEF(term)) {
  588.       if (META(lt))
  589.        fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = &_%s; (raf+%d) ->r = A_%d;\n",
  590.         aCount, aCount, REPR(lt), aCount, LEFTDEF(term));
  591.        else 
  592.          fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = _%s; (raf+%d) ->r = A_%d;\n",
  593.         aCount, aCount, REPR(lt), aCount, LEFTDEF(term));
  594.     } else if (META(term)) {
  595.       if (META(lt))
  596.         fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = &_%s; (raf+%d) ->r = &_%s;\n",
  597.         aCount, aCount, REPR(lt), aCount, REPR(term));
  598.       else 
  599.         fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = _%s; (raf+%d) ->r = &_%s;\n",
  600.         aCount, aCount, REPR(lt), aCount, REPR(term));
  601.      } else {
  602.       if (META(lt))
  603.       fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = &_%s; (raf+%d) ->r = _%s;\n",
  604.         aCount, aCount, REPR(lt), aCount, REPR(term));
  605.       else 
  606.         fprintf(output, "  (raf+%d) ->t = empty; (raf+%d) ->l = _%s; (raf+%d) ->r = _%s;\n",
  607.         aCount, aCount, REPR(lt), aCount, REPR(term));
  608.     } 
  609.     return;
  610.   }
  611.   if (NODENAME(lt) != affixtm) {
  612.     aCount += 1;
  613.     if (IS_LEFTDEF(lt))
  614.       fprintf(output, "  (raf+%d) ->t = empty;(raf+%d) ->l = A_%d;(raf+%d) ->r = (raf+%d);\n",
  615.         aCount, aCount, LEFTDEF(lt), aCount, aCount + 1);
  616.     else if (META(lt))
  617.       fprintf(output, "  (raf+%d) ->t = empty;(raf+%d) ->l = &_%s;(raf+%d) ->r = (raf+%d);\n",
  618.         aCount, aCount, REPR(lt), aCount, aCount + 1);
  619.     else
  620.       fprintf(output, "  (raf+%d) ->t = empty;(raf+%d) ->l = _%s;(raf+%d) ->r = (raf+%d);\n",
  621.         aCount, aCount, REPR(lt), aCount, aCount + 1);
  622.     det_nice_tree(BROTHER(lt), rt);
  623.   } else {
  624.     aCount += 1;
  625.     fprintf(output, "  (raf+%d) ->t = \"%s\";(raf+%d) ->l = nil;(raf+%d) ->r = (raf+%d);\n",
  626.       aCount, REPR(lt), aCount, aCount, aCount + 1);
  627.     det_nice_tree(BROTHER(lt), rt);
  628.   }
  629. }
  630.  
  631.  
  632.  
  633. nondet_code() {
  634.     if (MARKED(ulhs,external)) 
  635.        fprintf(output, "void u%s () { register cont *rq = q;\n",REPR(ulhs));
  636.     else
  637.        fprintf(output, "static void U_%d(){register cont *rq = q;\n",ulhs);
  638.     fprintf(output, "char *rc =c , *rip = ip;\n");
  639.     get_affixes(AFFIXDEF(SON(ulhs)),0);
  640.     qCount = nraffixes;
  641.     if (MARKED(ulhs,external)) 
  642.         fprintf(output,"  if (d%s(",REPR(ulhs));
  643.     else
  644.         fprintf(output,"  if (D_%d(",ulhs);
  645.     det_call(AFFIXDEF(SON(ulhs)));
  646.     if (memo_flag) 
  647.    fprintf(output, "  { q=rq+%d;(*(rq+%d)->q)();rq=q- %d;}\n", 
  648.      qCount - 1, qCount,qCount);
  649.     else 
  650.   fprintf(output, "  { q = rq+%d;(*(rq+%d)->q)();}\n", qCount - 1, qCount);
  651.     fprintf(output, "c  = rc; ip =rip;\n");
  652.      push_affixes(AFFIXDEF(SON(ulhs)),0);
  653.     if (MARKED(ulhs,external)) 
  654.      fprintf(output, "  (rq+1)-> q = u%s; q = rq+1; }\n", REPR(ulhs));
  655.     else
  656.      fprintf(output, "  (rq+1)-> q = U_%d; q = rq+1; }\n", ulhs);
  657. }
  658.  
  659. det_call(afx)
  660.   int             afx;
  661.   int affix = afx, count = 0;
  662.    
  663.   if (afx == nil)  {
  664.     fprintf(output, "))");
  665.     return;
  666.   } 
  667.  
  668.   for (; affix != nil; affix = BROTHER(affix)) 
  669.     if (BROTHER (affix) != nil)
  670.        fprintf(output, "A_%d,",count++); 
  671.     else   fprintf(output, "A_%d))\n",count++); 
  672. }
  673.  
  674. nondet_builtin_code() {
  675.        int ulhs;
  676.        for ( ulhs = laststdpred ; ulhs != nil; ulhs = BROTHER(ulhs)) {
  677.        fprintf(output, "void u%s () { register cont *rq = q;\n",REPR(ulhs));
  678.        get_affixes(AFFIXDEF(SON(ulhs)),0);
  679.        qCount = nraffixes;
  680.        fprintf(output,"  if ( d%s (",REPR(ulhs));
  681.        det_call(AFFIXDEF(SON(ulhs)));
  682.        fprintf(output,"  { \n");
  683.        fprintf(output, "  q = rq+ %d;(*(rq+%d)->q)(); rq = q- %d;\n", 
  684.               qCount - 1, qCount, qCount);
  685.        fprintf(output,"  } \n");
  686.        push_affixes(AFFIXDEF(SON(ulhs)),0);
  687.        fprintf(output, "  (rq+1)-> q = u%s; q = rq+1; }\n\n", REPR(ulhs));
  688. }
  689. }
  690. statistic_table() {
  691.        int ulhs,rule;
  692.        NtCount = 0;
  693.        for (rule = root; rule != laststdpred ; rule = BROTHER (rule))
  694.        COUNT(rule) = NtCount++; 
  695.        if (!MARKED(root,docompile) )
  696.             fprintf(output, "extern ");
  697.        fprintf(output, "int stat_tab[%d], stat_count;\n",NtCount); 
  698.        if (!MARKED(root,docompile))  return;
  699.        fprintf(output, "char * name_tab[%d] = { \"%s\"",NtCount,
  700.                  REPR(root)); 
  701.        for ( ulhs = BROTHER(root) ; ulhs != laststdpred; ulhs = BROTHER(ulhs)) {
  702.             fprintf(output,",\n  \"%s\"",REPR(ulhs));
  703.        }
  704.        fprintf(output,"  \n};\n");
  705.        
  706.        fprintf(output,"print_stat() { \n int nr = 0;\n\
  707.   for (;nr <= %d; nr++) {\n\
  708.   printf(\"%%d.%%s -> %%d\\n\",nr,name_tab[nr], stat_tab[nr]);}\n}",
  709.          NtCount-1);
  710. }
  711.  
  712. save_lattice_afx()
  713.   int affix = AFFIXDEF(SON(ulhs)),count = 0;
  714.    for (; affix != nil; count++,affix = BROTHER(affix)) 
  715.      if (LATTICE(affix))
  716.        fprintf(output, "  char *LA_%d = A_%d ->t;\n", count,count); 
  717. }
  718.  
  719. restore_lattice_afx()
  720.   int affix = AFFIXDEF(SON(ulhs)), count = 0;
  721.    for (; affix != nil; count++,affix = BROTHER(affix)) 
  722.     if (LATTICE(affix))
  723.      fprintf(output, "  A_%d->t = LA_%d;\n", count,count); 
  724. }
  725.